"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 26、内置库：多线程 threading.py
"""

import threading
import time


def task():
    print('扔第二个苹果')


def task2():
    print('扔第三个苹果')


def main():
    # threading.Thread创建了一个线程
    thread1 = threading.Thread(target=task)
    # 开启thread1子线程 : 扔第二个苹果
    thread1.start()
    # threading.Thread创建了第二个线程
    thread2 = threading.Thread(target=task2)
    # 开启thread2子线程 : 扔第三个苹果
    thread2.start()
    # 主线程：扔第一个苹果
    print('扔第一个苹果')


if __name__ == "__main__":
    main()  # 按顺序：先扔第二个，再是第三个，最后是第一个主线程


def task3():
    time.sleep(5)


def main1():
    # 开始时间
    start_time = time.time()
    thread1 = threading.Thread(target=task3)
    thread2 = threading.Thread(target=task3)
    thread1.start()
    thread2.start()
    # 让主线程等待子线程执行完毕才能运行
    thread1.join()
    thread2.join()
    end_time = time.time()
    print(end_time - start_time)  # join()  主线程等待子线程5s完


if __name__ == "__main__":
    main1()

"""
GIL锁 ：
    多线程是假象，python 多线程并不是并行执行，java 有 JM 机制（真正的多线程）
    1、python机制 ，保证线程安全。在同一时刻，只能有一个苹果在运行
    2、保证线程在同一时刻的安全。‘python的线程是一个假线程’

多线程 和 多进程：
    使用多进程 ： cpu密集型
    使用协程： IO密集型
    多线程是并发
    多进程是并行，多 CPU 运算时 
    类似于两组4 X 100接力赛。
    4组是并行运行，是多进程。
    其中一组4人，看成同时跑，是多线程
    多线程 比 多进程 更容易通讯。更改数据，多线程是可以感知到的
"""


# flask 是多个小丑 之间可以  通讯

# ===============  GIL锁机制：  多线程本质就是在排队等待 =====================

# 举例,单线程和多线程 执行 9999*9999 。 使用多进程 ： cpu密集型
# 多线程   运行时间为 12s
def task():
    a = 0
    while a != 9999 * 9999:
        a += 1


def main2():
    # 开始时间
    start_time = time.time()
    thread1 = threading.Thread(target=task)
    thread2 = threading.Thread(target=task)
    thread1.start()
    thread2.start()
    # 让主线程等待子线程执行完毕才能运行
    thread1.join()
    thread2.join()
    end_time = time.time()
    print(end_time - start_time)  # join()  主线程等待子线程5s完


if __name__ == '__main__':
    main()


# 单线程  9999*9999 + 9999*9999 ,运行时间也是  12s
def main3():
    start_time = time.time()
    a = 0
    while a != 9999 * 9999 * 2:
        a += 1
    end_time = time.time()
    print(end_time - start_time)


if __name__ == '__main__':
    main3()
